﻿/*----------------------------------------------------------------
// Copyright (C) 2014 苏州麦迪斯顿医疗科技股份有限公司
// 文件名：ValidationCallHandler.cs
// 文件功能描述：ValidationCallHandler
// 创建标识：顾伟伟-2014-04-03
----------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.Unity.InterceptionExtension;
using System.ComponentModel.DataAnnotations;
using System.Reflection;

namespace CPOE.Framework.Validation
{
    /// <summary>
    /// 在服务端使用Validator对输入参数执行验证，在方法上添加此类的Attribute声明后，方法在被执行时将自动注入以下行为
    /// </summary>
    public class ValidationCallHandler : ICallHandler
    {
        public int Order{get;set;}

        public ValidationCallHandler(int order)
        {
            this.Order = order;
        }
        /// <summary>
        /// 在执行目标方法前，对输入参数执行数据合法性校验
        /// </summary>
        /// <param name="input"></param>
        /// <param name="getNext"></param>
        /// <returns></returns>
        public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
        {
            //遍列所有输入参数
            for (int i = 0; i < input.Inputs.Count; i++)
            {
                ParameterInfo parameterInfo = input.Inputs.GetParameterInfo(i);
                if (parameterInfo.ParameterType.IsClass)
                {
                    try
                    {
                        Validator.ValidateObject(input.Inputs[i], new ValidationContext(input.Inputs[i], null, null),true);
                    }
                    catch (ValidationException ex)
                    {
                        //验证失败，向客户端回送ValidationException
                        return input.CreateExceptionMethodReturn(ex);
                    }
                }
            }

           return  getNext()(input, getNext);
        }

        
        
    }
}
